package protocolo;

import java.io.IOException;
import java.net.*;
import java.util.ArrayList;

import protocolo.Pedido.TipoPedido;

import monitor.ManagerObjetos;


public class Atendedor extends Thread {
	
	//	 En que puerto escucharemos
	private int miPuerto = 54321;
	
	public ArrayList<Pedido> pedidosAliados;
	public ArrayList<Pedido> respuestasAliados;
	
	private DatagramSocket miSocket;
	
	
	public Atendedor() {
		
		// Creamos el socket
		try {
			System.err.println("Cree mi socket pelao");
			miSocket = new DatagramSocket(miPuerto, InetAddress.getByName("192.168.32.31"));
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			System.err.println("Error al crear mi socket");
			e.printStackTrace();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			System.err.println("Error al crear mi socket, host no identificado");
		}
		 
		pedidosAliados = new ArrayList<Pedido>();
		respuestasAliados = new ArrayList<Pedido>();
		
	}
	
	public Atendedor(String IP) {
		
		// Creamos el socket
		try {
			System.err.println("Cree mi socket pelao");
			miSocket = new DatagramSocket(miPuerto, InetAddress.getByName(IP));
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			System.err.println("Error al crear mi socket");
			e.printStackTrace();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			System.err.println("Error al crear mi socket, host no identificado");
		}
		 
		pedidosAliados = new ArrayList<Pedido>();
		respuestasAliados = new ArrayList<Pedido>();
		
	}

	
	
	// Me quedo bloqueado recibiendo paquetes
	public void run() {
				
		while (true) {
			// Creamos un DatagramPacket y hacemos un receive
			byte buf[] = new byte[1];
			DatagramPacket pack = new DatagramPacket(buf, buf.length);
			try {
				miSocket.receive(pack);
				System.err.println("Me desbloquee del receive");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				//System.err.println("Error al recibir el paquete  ;P");
				pack = null;
				break;
			}
			
			if (pack != null) {
				// Obtenemos los datos del mensaje de acuerdo al protocolo
			
				Pedido pedido = new Pedido();
				pedido = pedido.obtenerPedido(pack);
				
				// Agregamos el pedido al buffer que corresponda
				if (pedido.esAyuda()) {
					synchronized (pedidosAliados) {
						if (! pedidosAliados.isEmpty()) {
							// lanzar timer
						}
						pedidosAliados.add(pedido);
					}
				} else if (pedido.esAccepted()){
					synchronized (pedidosAliados) {
						if (! pedidosAliados.isEmpty()) {
							pedidosAliados.get(0).setTipo(TipoPedido.ACCEPTED);
						}
					}
				} else {
					synchronized (respuestasAliados) {
						respuestasAliados.add(pedido);
					}
				}
				
				// Imprimimos
				System.err.println("Se Recibieron datos de: " + pedido.getDireccionIP() + ":" + pedido.getPuerto() + " con largo: " +  pack.getLength());
				System.err.println(Integer.toBinaryString(pack.getData()[0]));
				System.out.println();	
				
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	public void shutdown() {
		if (miSocket != null)
			miSocket.close();
	}
	

}
